#include <stdbool.h>
#include <stddef.h>
#include <string.h>
#include <stdio.h>
#include <stdlib.h>

#include "lista.h"
#include "hash.h"
#include "equipo.h"
#include "abb.h"

#define CANTIDAD_JUGADORES 23

struct equipo{
	char *pais;
	abb_t *nombre_jugadores;
	jugador_t **jugadores_dorsal;
};

equipo_t *equipo_crear(char *pais, jugador_t **jugadores)
{
	equipo_t *equipo = malloc(sizeof(equipo_t));
	if(!equipo)
		return NULL;
	
	equipo->pais = pais;	
	
	equipo->jugadores_dorsal = jugadores;
	
	equipo->nombre_jugadores = abb_crear(strcmp,NULL);
	
	if(!equipo->nombre_jugadores)
	{	
		free(equipo->pais);
		free(equipo);		
		return NULL;
	}
	
	for(int i=0; i<CANTIDAD_JUGADORES;i++)
	{	
		jugador_t *jugador = jugadores[i];
		if(!abb_guardar(equipo->nombre_jugadores,jugador_obtener_nombre(jugador),jugador))
		{
			fprintf(stderr,"ERROR: abb_guardar devuelve falso\n");
			break;
		}
	}
	
	return equipo;
}

void equipo_imprimir_por_dorsal(equipo_t *equipo)
{
	for(int i=0;i<CANTIDAD_JUGADORES;i++)
	{
		jugador_imprimir_dorsal(equipo->jugadores_dorsal[i]);
	}
}

bool visitar(const char *clave, void *dato, void *extra)
{
	if(!extra)
		return false;
	
	jugador_t *jugador = (jugador_t *)dato;	
	
	printf("%s , %d:  Goles:  %d\n",clave,jugador_obtener_dorsal(jugador),jugador_obtener_goles(jugador));
	
	return true;	
}

void equipo_imprimir_por_nombre(equipo_t* equipo)
{
	bool extra = true;
	abb_in_order(equipo->nombre_jugadores,visitar,&extra);
}

jugador_t *equipo_buscar_jugador_por_dorsal(equipo_t *equipo,int dorsal)
{	
	return equipo->jugadores_dorsal[dorsal-1];	
}

bool equipo_mirar(void *dato)
{	
	equipo_t *equipo = (equipo_t *)dato;	
	if(!equipo)
	{
		puts("Equipo es null");
		return false;
	}		
	
	if(!strcmp(equipo->pais,""))
	{
		puts("pais es vacio");
		return false;
	}	
	
	//printf("Equipo [%d]: \"%s\"\n",*(int *)extra,equipo->pais);
	printf("Equipo: \"%s\"\n",equipo->pais);
	
	for(unsigned i=0; i<CANTIDAD_JUGADORES; i++)
		printf("[%d] \"%s\"\n",i+1,jugador_obtener_nombre(equipo->jugadores_dorsal[i]));
	
	//*(int *)extra += 1;	
	
	return true;
}

const char *equipo_obtener_pais(equipo_t *equipo)
{
	return equipo->pais;
}

void equipo_destruir(equipo_t *equipo)
{	
	free(equipo->pais);
	
	for(int i=0; i<CANTIDAD_JUGADORES; i++)
		jugador_destruir(equipo->jugadores_dorsal[i]);
	 
	free(equipo->jugadores_dorsal);
	
	abb_destruir(equipo->nombre_jugadores);
	
	free(equipo);
}
